package io.scnb.lesson002.demo3;

import org.junit.Test;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;

import java.util.Arrays;

public class BeanDefinitionRegistryTest {
    
    @Test
    public void test() {
        // 创建一个bean工厂，默认实现了BeanDefinitionRegistry接口，所以也是一个bean注册器
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        
        // 定义一个bean
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(String.class);
        genericBeanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, "scnb");
        
        // 将bean注册到容器中
        factory.registerBeanDefinition("name", genericBeanDefinition);
        // 通过名称获取BeanDefinition
        System.out.println(factory.getBeanDefinition("name"));
        // 通过名称判断是否注册过BeanDefinition
        System.out.println(factory.containsBeanDefinition("name"));
        // 获取所有注册的名称
        System.out.println(Arrays.asList(factory.getBeanDefinitionNames()));
        // 获取已注册的BeanDefinition的数量
        System.out.println(factory.getBeanDefinitionCount());
        // 判断指定的name是否已被使用
        System.out.println(factory.isBeanNameInUse("name"));
        
        // 别名相关方法
        // 为name注册两个别名
        factory.registerAlias("name", "alias-name-1");
        factory.registerAlias("name", "alias-name-2");
        
        // 判断alias-name-1是否已被用作别名
        System.out.println(factory.isAlias("alias-name-1"));
        
        // 通过名称获取对应的所有别名
        System.out.println(Arrays.toString(factory.getAliases("name")));

        System.out.println(factory.getBean("name"));
    }
}
